﻿/**********************************************************************
 * @file   FITKFlowOFHDF5AdaptorMesh.h
 * @brief  hdf5 网格数据读写接口
 * @author liuzhonghua (liuzhonghuaszch@163.com)
 * @date   2024-09-13
 *********************************************************************/
#ifndef __FITKFLOWOFHDF5ADAPTORMESH_R_H__
#define __FITKFLOWOFHDF5ADAPTORMESH_R_H__

#include "FITKFlowOFIOHDF5API.h"
#include "FITKFlowOFHDF5AbstractAdaptor.h"
#include "FITK_Kernel/FITKCore/FITKCoreMacros.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 //前置声明
ForwardDeclarNS(Interface, FITKUnstructuredFluidMeshVTK)
ForwardDeclarNS(Interface, FITKUnstructuredMesh)
ForwardDeclarNS(Interface, FITKElementList)
ForwardDeclarNS(Interface, FITKNodeList)
ForwardDeclarNS(H5, Group)

namespace IO
{
    /**
     * @brief HDF5 Geometry 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-05-30
     */
    class FITKFLOWOFIOHDF5API FITKFlowOFHDF5AdaptorMesh : public FITKFlowOFHDF5AbstractAdaptor
    {
    public:
        explicit FITKFlowOFHDF5AdaptorMesh() = default;
        ~FITKFlowOFHDF5AdaptorMesh() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-30
         */
        QString getAdaptorClass() override;

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-30
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-30
         */
        bool adaptW() override;

    private:
        bool fieldMeshW();
        bool fieldMeshR();

        bool boundaryMeshW();
        bool boundaryMeshR();

        /**
         * @brief 读取网格节点
         * @param mesh 网格数据结构
         * @param h5Group HDF5块结构
         * @return 是否写出成功
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-29
         */
        bool readNode(Interface::FITKNodeList* mesh, H5::Group& h5Group);

        /**
         * @brief 读取单元节点
         * @param mesh 网格数据结构
         * @param h5Group HDF5块结构
         * @return 是否写出成功
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-29
         */
        bool readElement(Interface::FITKElementList* mesh, H5::Group& h5Group);


        /**
         * @brief 写出网格节点
         * @param mesh 网格数据结构
         * @param h5Group HDF5块结构
         * @return 是否写出成功
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-29
         */
        bool writeNode(Interface::FITKNodeList* mesh, H5::Group& h5Group);

        /**
         * @brief 写出单元节点
         * @param mesh 网格数据结构
         * @param h5Group HDF5块结构
         * @return 是否写出成功
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-29
         */
        bool writeElement(Interface::FITKElementList* mesh, H5::Group& h5Group);



    private:
        /**
         * @brief  网格数据
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date   2024-09-09
         */
        Interface::FITKUnstructuredFluidMeshVTK* _unstructuredMesh{};
    };

    Register2FITKIOAdaptorFactory(HDF5, Interface::FITKUnstructuredFluidMeshVTK, FITKFlowOFHDF5AdaptorMesh)
}


#endif // !1

